#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <string>
#include <unistd.h>
int num=10;
using namespace std;
void* routine(void* args)
{
    sleep(1);
    string name((char*)args);
    delete (char*)args;
    for(int i=0;i<5;i++)
    {
        cout<<"新线程的名字："<<name<<endl;
        sleep(1);
    }
    return nullptr;
}
int main()
{
	vector<pthread_t> tids;
	for(int i=0;i<num;i++)
	{
		pthread_t tid;
		//char id[64];//错误的：传递指针给线程：你将 id 的地址传递给线程，而 id 是一个栈变量。栈上的内存是 临时的，当函数返回时（即 for 循环的每次迭代结束时），栈上的内存就会被回收。
        //线程竞争：假设在某一次 pthread_create 调用时，线程可能还没来得及读取 id 内容，主线程就进入下一次迭代，id 的内容被覆盖了。而由于线程是异步执行的，线程很有可能在内存被修改后再开始执行，从而读取到相同的数据（如“pthread-9”）。
        char* id=new char[64];
		snprintf(id,64,"pthread-%d",i);
		int n=pthread_create(&tid,nullptr,routine,id);
		if(n==0) tids.push_back(tid);
		else continue;
    }
    for(int i=0;i<num;i++)
    {
        int n=pthread_join(tids[i],nullptr);
        if(n==0) cout<<"等待新线程成功,线程号："<<tids[i]<<endl;
        sleep(1);
    }
	return 0;
}
